<?php
class PersistenceController
{
	/**
	 * Recibe una entidad con o sin id y le indica al DAO que la persista
	 * con el id correcto.
	 * @param EntityBase $entity La entidad a persistir.
	 * @param DAO $dao El DAO con el que debe ser persistida la entidad.
	 */
	public static function persist($entity, $dao)
	{
		if($entity->getId() != null){
			if(PersistenceController::checkExistingId($entity)){
				$dao->persist($entity);
			} else {
				throw new Exception("Attempt to persist corrupted entity.");
			}
		} else {
			$newId = PersistenceController::getNextId($entity->getTableName());
			$entity->assignId($newId);
			$dao->persist($entity);
		}
	}
	
	/**
	 * Chequea que una entidad determinada haya sido previamente persistida (y
	 * por lo tanto, que exista el id en la tabla que le corresponde).
	 * @param EntityBase $entity
	 */
	static function checkExistingId($entity)
	{
		require_once "classes/persistence/DBManager.php";
		$db = DBManager::getConnection();
		
		$id = $entity->getId();
		$tableName = $entity->getTableName();
		//TODO: verificar si esto funciona. Capaz que es mejor hacerlo con un EXISTS SQL.
		$results = $db->fetchAll("SELECT ID FROM $tableName WHERE ID = $id");
		//TODO: verificar que funcione la palabra empty sea para arrays.
		
		$db->closeConnection();
		
		if(empty($results)){
			return false;
		} else {
			return true;
		}		
	}
	
	/**
	 * Obtiene el id consecutivo al más grande encontrado en la tabla correspondiente a $tableName.
	 * @param string $tableName El nombre de la tabla. 
	 */
	public static function getNextId($tableName)
	{
		require_once "classes/persistence/DBManager.php";
		$db = DBManager::getConnection();
		
		$result = $db->fetchAll("SELECT max(ID) FROM $tableName");
		
		$db->closeConnection();
		
		return $result[0]["MAX(ID)"] + 1;		
	}
}